package lxmysql

import (
	"encoding/json"
	"gitee.com/lxgow/lxredis"
	"github.com/astaxie/beego/orm"
	lconv "github.com/lixu-any/go-tools/conv"
	"strings"
)

var LXMYSQLCACHEDB string //默认缓存数据库

type QueryCacheConfig struct {
	SQL       string    //sql
	DBIndex   string    //指定数据库
	CacheDB   string    //数据库缓存 Redis数据库索引
	CacheName string    //缓存的名字
	Orm       orm.Ormer //实例化 ORM
	Exexpire  int       //缓存过期时间 -1不使用缓存
}

type QueryConfig struct {
	SQL     string    //sql
	DBIndex string    //指定数据库
	Orm     orm.Ormer //实例化 ORM
}

// QueryWithCache 查询数据
func QueryWithCache(config QueryCacheConfig, result interface{}, args ...interface{}) (err error) {

	var cacheKey string

	if len(config.CacheName) > 0 {
		cacheKey = config.CacheName
	} else {
		cacheKey = "mysql::" + GenCacheKey(config.SQL, args)
	}

	if config.Exexpire == 0 {
		config.Exexpire = DEFAULT_EXPIRE
	}

	if config.CacheDB == "" {
		config.CacheDB = LXMYSQLCACHEDB
	}

	_redis := lxredis.LXredis{
		Name: cacheKey,
		Db:   config.CacheDB,
	}

	if config.Exexpire > 0 {
		if b, _ := _redis.IsExist(); b {
			str, _ := _redis.GET()
			if str != "" {
				// 如果缓存中有数据，则直接返回数据
				err = json.Unmarshal([]byte(str), result)
				if err == nil {
					return
				}
			}
		}
	}

	if config.Orm == nil {
		config.Orm = orm.NewOrm()
	}

	if len(config.DBIndex) > 0 {
		config.Orm.Using(config.DBIndex)
	}

	if _, err = config.Orm.Raw(config.SQL).QueryRows(result); err != nil {

		if strings.Contains(err.Error(), "doesn't exist") {
			err = nil
			return
		}
		return
	}

	if config.Exexpire > 0 {
		_redis.Val = lconv.JsonEncode(result)
		_redis.SetTime(config.Exexpire)
	}

	return
}

// Query 查询数据
func Query(config QueryConfig, result interface{}, args ...interface{}) (err error) {

	if config.Orm == nil {
		config.Orm = orm.NewOrm()
	}

	if len(config.DBIndex) > 0 {
		config.Orm.Using(config.DBIndex)
	}

	if _, err = config.Orm.Raw(config.SQL).QueryRows(result); err != nil {
		if strings.Contains(err.Error(), "doesn't exist") {
			err = nil
			return
		}
		return
	}

	return
}

// FindOne 查询一条数据
func FindOne(config QueryConfig, result interface{}, args ...interface{}) (err error) {

	if config.Orm == nil {
		config.Orm = orm.NewOrm()
	}

	if len(config.DBIndex) > 0 {
		config.Orm.Using(config.DBIndex)
	}

	if err = config.Orm.Raw(config.SQL).QueryRow(result); err != nil {
		if strings.Contains(err.Error(), "doesn't exist") {
			err = nil
			return
		}
		return
	}

	return
}
